# Пораждающий шаблон проектирования ("Прототип")
# Позволяет копировать объекты не вдаваясь в подробнотси реализации

import copy


class Sheep:
    __name: str = ''
    __param: dict = {"Вес": 20, "Рост": 34}

    def __init__(self, donor: 'Sheep' = None):
        if donor is not None:
            self.__name = donor.get_name()
            self.__param = copy.deepcopy(donor.get_params())

    def set_name(self, name: str):
        self.__name = name

    def get_name(self) -> str:
        return self.__name

    def get_params(self) -> dict:
        return self.__param

    def set_weight(self, new_weight: int):
        self.__param["Вес"] = new_weight

    def clone(self):
        return Sheep(self)


if __name__ == "__main__":
    sheep_donor: Sheep = Sheep()
    sheep_donor.set_name('Долли')

    sheep_clone: Sheep = sheep_donor.clone()
    print('Донор:', sheep_donor.get_name(), sheep_donor.get_params())
    print('Клон:', sheep_clone.get_name(), sheep_clone.get_params())

    sheep_clone.set_weight(35)
    sheep_clone.set_name("Ирина")

    print('Донор:', sheep_donor.get_name(), sheep_donor.get_params())
    print('Клон:', sheep_clone.get_name(), sheep_clone.get_params())

# Донор: Долли {'Вес': 20, 'Рост': 34}
# Клон: Долли {'Вес': 20, 'Рост': 34}
# Донор: Долли {'Вес': 20, 'Рост': 34}
# Клон: Ирина {'Вес': 35, 'Рост': 34}
